package com.zp.self.module.level_4_算法练习.数据结构.String;

/**
 * @author By ZengPeng
 */
public class 力扣_557_反转字符串中的单词III {
    //测试
    public static void main(String[] args) {

        System.out.println(new 力扣_557_反转字符串中的单词III().reverseWords("Let's take LeetCode contest"));
        System.out.println(new 力扣_557_反转字符串中的单词III().reverseWords("God Ding a"));
        System.out.println(new 力扣_557_反转字符串中的单词III().reverseWords("W"));
    }

    /**
    题目：给定一个字符串 s ，你需要反转字符串中每个单词的字符顺序，同时仍保留空格和单词的初始顺序。

     示例 1：
     输入：s = "Let's take LeetCode contest"
     输出："s'teL ekat edoCteeL tsetnoc"

     示例 2:
     输入： s = "God Ding"
     输出："doG gniD"

    分析：【P ♥】
       1.遍历+翻转字符串：这里尽量避免使用截取字符串，会产生额外的内存消耗
                          应当使用char数组,数组位置置换，应该更剩内存
            -- 执行用时：3 ms, 在所有 Java 提交中击败了91.86%的用户
    边界值 & 注意点：
       1.
     **/
    public String reverseWords(String s) {
        char[] chars = s.toCharArray();
        int start=0,end=0;
        for (int i = 0; i < chars.length; i++) {
            if(chars[i]==' '){
                reverse(chars,start,end-1);
                start=end=i+1;
            }
            else
                end++;
        }
        reverse(chars,start,end-1);
        return  String.valueOf(chars);
    }

    private void reverse(char[] chars, int start, int end) {
        while (start<end){
            chars[start]^=chars[end];
            chars[end]^=chars[start];
            chars[start++]^=chars[end--];
        }
    }
}
